/*-------------------------------------------------------------------------
 *
 * pqsignal.c
 *	  从RWW窃取的可靠BSD风格的signal(2)例程，RWW又是从Stevens那里窃取的...
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *	  src/port/pqsignal.c
 *
 *	我们现在假设所有Unix类系统都有支持可重启动信号(SA_RESTART)的POSIX sigaction(2)。
 *	我们之前也支持BSD风格的signal(2)，但现在应该没有什么东西还不具备POSIX API。
 *
 *	当然，Windows绝对是一个独立的类别。在后端，我们根本不使用这个文件；
 *	src/backend/port/win32/signal.c为后端环境提供pqsignal()。前端程序可以使用
 *	这个版本的pqsignal()，但请注意，这在Windows上不提供可重启动信号。
 *
 * ------------------------------------------------------------------------
 */

#include "c.h"

#include <signal.h>

#if !defined(WIN32) || defined(FRONTEND)

/*
 * 为信号"signo"设置一个信号处理程序，带SA_RESTART
 *
 * 返回先前的处理程序。
 *
 * 注意：此函数的实际名称在编译时取决于是否使用了 -DFRONTEND，
 * 如果使用，则为 pqsignal_fe；如果没有使用，则为 pqsignal。
 * 这样做是为了避免与libpq的legacy-pqsignal.c发生名称冲突。
 */
pqsigfunc pqsignal(int fc_signo, pqsigfunc fc_func)
{
#ifndef WIN32
	struct sigaction fc_act,
				fc_oact;

	fc_act.sa_handler = fc_func;
	sigemptyset(&fc_act.sa_mask);
	fc_act.sa_flags = SA_RESTART;
#ifdef SA_NOCLDSTOP
	if (fc_signo == SIGCHLD)
		fc_act.sa_flags |= SA_NOCLDSTOP;
#endif
	if (sigaction(fc_signo, &fc_act, &fc_oact) < 0)
		return SIG_ERR;
	return fc_oact.sa_handler;
#else							/* WIN32 */
	return signal(signo, func);
#endif
}

#endif							/* !defined(WIN32) || defined(FRONTEND) */
